iT邦幫忙

1

0 day 安全筆記 第二章 基本知識 下

  • 分享至 

  • xImage
  •  

OS:XP SP3
編譯器: DEV C++ 4.9.9.2

工具:
OD (ollydbg)

大家可以去先查詢一下 組合語言(32位元)方面的知識,然後至少要了解 stack區常用的指令 PUSH 跟 POP,與EIP寄存器 不用了解全部章節。

實驗目的:了解函數的進入與退出

#include <stdio.h>
#include <stdlib.h>
void func(void);

//全域變數 
int g1=0;
int g2=1;



int main()
{
    //區域變數 
    int a=2;
    int b=3;
    
    func();
    
    
    system("pause");
    return 0;
    
}


void func(void)
{    
     //區域變數 
     int x=7;
     int y=8;
     
     
}

關於組合語言的知識一偏文肯定講不完。所以這次給大家簡單的方式說明。

stack 區域是一個公共空間,任何函數都可以使用,但是每個函數都有自己的空間,所以使用前,要先規定自己的基底,這個基底的標記就是 寄存器(EBP)。

函數的基底 EBP 規劃好後 可以開始往上佔領其他空間了。

而這個工作需要交給寄存器 (ESP)

打開OD觀察 stack 區

你可以先在 main 函數 裡面隨便找個地方 按F2設中斷 然後F9執行 接下來一直F7走過每一條指令透過觀察發現,esp 一直在變動。 ebp 則不會。

img

1.Ctrl + F2 重新載入
2.找到 main 函數 調用 func函數(call)那行按下F2
3.找到 func 函數 LEAVE 那行按下F2
4.按下F9 跑到 main函數的中斷 觀察 stack 區

img

可以看到 EBP 到 ESP 的空間 就是目前函數正在使用的空間

5.在按下F9就會跑到 func函數的中斷 觀察 stack 區

img

比對一下可以發現 main函數 呼叫進入 func函數 EBP會變動(前面說過 每個函數都要先規劃自己的基底)

但是執行完 func函數 還要回到 main函數,慢慢F7,執行 leave RETN

img

leave = mov esp,ebp ### pop ebp
retn = pop eip

這兩條指令又稱為 Function Epilogue 也就是函數的結尾,目的是在釋放自己的領土,然後歸還給 main 函數

與之對應的 Function Prologue 函數的開頭被跳過去了,給大家看一下長什麼樣子

img

push ebp # 儲存 main數的 ebp到堆疊
mov ebp,esp # 規劃自己的基底

最後了解一下 call(調用函數) 這個指令: 他會把 call 下一行的地址給推入堆疊。

call(調用) 加上 (Function Prologue) 加上 (Function Epilogue) 一起看

img

call 推入下一行(004012CD)到堆疊

push ebp # 儲存 main數的 ebp到堆疊
mov ebp,esp # 規劃自己的基底

leave = mov esp,ebp (釋放自己的領土回到基底) ### pop ebp (歸還 main的ebp)
retn = pop eip (回到004012CD)

透過觀察可以發現在一個函數規劃好自己的基底後堆疊上面通常儲存著區域變數,例如本例的 x=7 , y=8。

這邊沒有列出歸還的流程圖,大家有興趣可以手動調適一下應該不會很難。

如果有任何問題歡迎指教,謝謝。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言